package com.vlyman.weixin.receive;

import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 类描述：
 *	 微信返回信息处理
 *  @author chenjs
 *  @date 2019/7/12 16:17
 **/
@Slf4j
public class ReceiveMsg {

	/**
	 * 方法描述：<br>
	 * 	解析微信返回报文
	 * 	报文格式详情：http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html
	 * @author: chenjs
	 * @param request
	 * @return
	 * @date: 2016年11月9日
	 */
	public static Map<String, String> parseMessage(HttpServletRequest request) {
		return simpleHandler(getHttpServletRequestContent(request));
	}
	
	/**
	 * 方法描述：<br>
	 * 	微信返回xml报文简单处理
	 * 	由于时间紧迫就不仔细做通用的处理了
	 * @author: chenjs
	 * @param requestContent
	 * @return
	 * @date: 2016年11月9日
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, String> simpleHandler(String requestContent){
		try {
			Map<String, String> rtnMap = new HashMap<>(8);
			Document document = DocumentHelper.parseText(requestContent);
			Element root = document.getRootElement();
			Iterator<Element> itr = root.elementIterator();
			while (itr.hasNext()) {
				Element element = itr.next();
		        String name = element.getName();
		        String value = element.getTextTrim();
		        rtnMap.put(name, value);
			}
			return rtnMap;
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			log.error("解析微信返回报文出错！");
			log.error(requestContent);
		}
		return null;
	}
	
	/**
	 * 方法描述：<br>
	 * 	获取来自HttpServletRequest里面的请求内容
	 * @author: chenjs
	 * @param request
	 * @return
	 * @throws Exception
	 * @date: 2016年11月9日
	 */
	public static String getHttpServletRequestContent(HttpServletRequest request){
		BufferedReader br;
		try {
			br = request.getReader();
			StringBuffer sb = new StringBuffer();
			int c = 0;
			while ( (c = br.read()) != -1) {
				sb.append((char)c);
			}
			log.info("HttpServletRequest的请求内容：" + sb);
			return sb.toString();
		} catch (Exception e) {
			log.error("HttpServletRequest的请求内容解析异常：", e);
			return "";
		}
	}
}
